#include "TElemListaMensajes.h"

int TNLM_Crear(TElemListaMensajes* elemento, TPuerto puerto, int tam_elemento) {
	elemento->tam_elemento = tam_elemento;
	elemento->puerto = puerto;
	elemento->mensajes_prioritarios = (TPila*) malloc(sizeof(TPila));
	elemento->mensajes_no_prioritarios = (TCola*) malloc(sizeof(TCola));

	Pila_Crear(elemento->mensajes_prioritarios, elemento->tam_elemento);
	Cola_Crear(elemento->mensajes_no_prioritarios, elemento->tam_elemento);

	return NLM_OK;
}

int TNLM_Destruir(TElemListaMensajes* elemento) {
	elemento->tam_elemento = -1;
	elemento->puerto = -1;


	Pila_Vaciar(elemento->mensajes_prioritarios);
	Cola_Vaciar(elemento->mensajes_no_prioritarios);

	return NLM_OK;
}


int TNLM_ObtenerPuerto(TElemListaMensajes* elemento) {
    return (elemento->puerto);

}

int TNLM_InsertarMensajePrioritario(TElemListaMensajes* elemento, TMensaje* mensaje_in) {

    int error;

    error =	Pila_Agregar(elemento->mensajes_prioritarios, mensaje_in);

    if (error) {
        return NLM_ERR_MEMORIA;
    }
    else {
        return NLM_OK;
    }
}


int TNLM_InsertarMensajeNoPrioritario(TElemListaMensajes* elemento, TMensaje* mensaje_in) {

	int error;

	error = Cola_Agregar(elemento->mensajes_no_prioritarios, mensaje_in);

	if (error == COLA_ERR_MEMORIA) {
		return NLM_ERR_MEMORIA;
	}
	else {
		return NLM_OK;
	}
}


int TNLM_ObtenerMensajePrioritario(TElemListaMensajes* elemento, TMensaje* mensaje_out) {

	int error;

	error = Pila_Sacar(elemento->mensajes_prioritarios, mensaje_out);

	if (error == PILA_VACIA) {
		return NLM_ERR_NOHAYMENSAJES;
	}
	else {
	    if ((Pila_Vacia(elemento->mensajes_prioritarios)) && (Cola_Vacia(*(elemento->mensajes_no_prioritarios)))){
            TNLM_Destruir(elemento);
        }
		return NLM_OK;
	}
}


int TNLM_ObtenerMensajeNoPrioritario(TElemListaMensajes* elemento, TMensaje* mensaje_out) {

	int error;
	error = Cola_Sacar(elemento->mensajes_no_prioritarios, &mensaje_out);

	if (error == COLA_ERR_VACIA) {
		return NLM_ERR_NOHAYMENSAJES;
	}
	else {
	    if ((Pila_Vacia(elemento->mensajes_prioritarios)) && (Cola_Vacia((*elemento->mensajes_no_prioritarios)))){
            TNLM_Destruir(elemento);
        }
		return NLM_OK;
	}
}
